perm filename NTFIXD.WRU[DOC,AIL]1 blob sn#060594 filedate 1973-09-04 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00007 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	This file contains some descriptions of some known bugs which have not
C00003 00003	1. Calling  a parametric procedure whose actual is not in the same file
C00005 00004	2. FOREACH searches with one ELEMENT ANY and one unbound local sometimes
C00007 00005	3. Calling a procedure with an expression where a reference parameter is
C00009 00006	4. There is no way to use a derived set simply within a FOREACH context.
C00010 00007	5. ERASES  sometimes cause havoc within foreaches.
C00012 ENDMK
C⊗;
This file contains some descriptions of some known bugs which have not
been fixed either because it is not known how to fix them or it is
more trouble to fix them than they are worth.

1. Calling  a parametric procedure whose actual is not in the same file
   and is not SIMPLE or an outer block procedure will cause an infinite
   loop in the procedures prologue because the static link cannot be
   calculated by following the current static link.
   E.G.

   Program 1:
   BEGIN "PRG1"
	EXTERNAL PROCEDURE FOO(PROCEDURE BAZ);
	REQUIRE "PRG2" LOAD_MODULE;
	PROCEDURE F1(INTEGER X);
	BEGIN
		PROCEDURE FUBAR;
		BEGIN
			OUTSTR("HI"&CVS(X));
		END;

	        FOO(FUBAR);
	END;
	F1;
   END "PRG1"

   Program 2:
   ENTRY FOO;
   BEGIN "PRG2"
	INTERNAL PROCEDURE FOO(PROCEDURE BAZ);
	BEGIN
		BAZ;
	END;
   END "PRG2"
2. FOREACH searches with one ELEMENT ANY and one unbound local sometimes
   returns duplicates of satisfier.

   E. G. if associative store contains:

		A1⊗O1≡V1
		A1⊗O2≡V1
		A1⊗O3≡V1

	FOREACH X | X⊗ANY ≡ V1 DO
		DATUM(X)←DATUM(X)+1;

   The datum of A1 will be incremented by 3, rather than the 1 which is
   expected. Note that this is different than the duplicate satisfiers
   obtained when a list search containing multiple instances of an item
   is used to bind a local. Note that the semantics of

	FOREACH x | x ε LIST1 ∧ A⊗x≡V DO

   is different from the semantics for

	FOREACH x | A⊗x≡V ∧ x ε LIST1 DO

   as the first allows duplications of "x" while the second does not.
3. Calling a procedure with an expression where a reference parameter is
   required (i. e. when a CORTMP must be allocated such as for all
   FORTRAN procedures) from within a recursive context sometimes fails
   because the CORTMP is remopped too early (before the ISUCAL) and is
   used to save some random accumulator.

   E.G.

   BEGIN
	INTEGER PROCEDURE FOO(REFERENCE INTEGER A,B);
		RETURN(A+B);
	RECURSIVE PROCEDURE MUMBLE;
	BEGIN
		INTEGER A,B;
		A ← 2;
		B ← 3;
		A ← (A+B)+FOO(A+0,B);
	END;
	MUMBLE;
   END;

   This particular case will probably not cause very many difficulties as
   a warning message about passing A+0 by reference is given and most
   people would recompile. However if the procedure FOO were a FORTRAN
   procedure no such message would be emitted and the user would have
   no way of knowing he should suspect his results.
4. There is no way to use a derived set simply within a FOREACH context.
   This at least gives an error message to the user when he compiles a
   construct such as:

	FOREACH x | x ε A⊗B DO

   The problem is that RFS made work for
	FOREACH y | A⊗(A⊗B)≡y DO

   It is very difficult to get it to work both ways.

   The same problem exists with bracketed triples within foreaches.
5. ERASES  sometimes cause havoc within foreaches.
	If an association is erased which is pointed to by some SCB
	that pointer should be altered in some way to indicate it
	is no longer valid so that at least an error message can be given
	This is very difficult to handle efficiently because it entails
	a search of every active SCB and in the majority of cases
	this search is for naught. Also some SCB's are hidden on the
	stack such as within make and erase breakpoints.

	Processes add even more hair in finding all the SCB's

6. Changing a set or list variable which is being searched within some encompassing
	FOREACH (dynamic) can sometimes cause the FOREACH interpreter to
	end up searching the free-storage list.


	This can occur when we REMOVE the next item that would have been
	returned, or when we change the value of the variable by assignment.
	
	This is almost impossible to detect without extreme overhead  in
	the set and list assignment code to check each node in the old value
	of the set to see if it is pointed to by some SCB.

	We can always get around this by making a temp set by concatenating a
	nil list or unioning a phi set to copy the list or set variable.